import { isObject } from "../utils/index.js";
class Observer {
  constructor(value){
    // 如果数据层次过多，需要递归解析 依次增加get/set
    this.walk(value)
  }
  walk(data) {
    let keys = Object.keys(data);
    keys.forEach(key => {
      defineReactive(data, key, data[key])
    });
  }
}
// 定义响应式数据
function defineReactive(data, key, value) {
  // 递归实现深度检测
  observe(value)
  Object.defineProperty(data, key, {
    get(){
      return value
    },
    set(newVal){
      observe(newVal)
      if (value === newVal) return;
      value = newVal
    }
  })
}
// 把data中的属性，全部使用Object.defineProperty()重新定义
export function observe(data) {
  let isObj = isObject(data)
  if (!isObj) {
    return
  }
  return new Observer(data) // 观测对象
}